//ts常用类型
let num:number=10
let str:string='字符串'
let bol:boolean=true
let nul:null=null
let und:undefined=undefined
let any:any=1
any='字符串'
any=true
any=null
any=undefined
//symbol
let symbol:symbol=Symbol('10')
let v:void=undefined//通常作为函数返回值，即函数无返回值时使用
//联合类型
let res:number|string=21
res='字符串'


//数组类型两种方法
//方法一：
let numarr1:number[]=[23,123,32]
let strarr1:string[]=['字符串','字符串']
//联合类型数组：
let resarr1:(number|string)[]=[12,32,123,'字符串']
//方法二：
let numarr2:Array<number>=[23,123,32]
let strarr2:Array<string>=['字符串','字符串'] 
//联合类型数组：
let resarr2:Array<number|string>=[12,32,123,'字符串']

// 元组：是一种特殊的数组，它允许你定义一个固定长度的数组，其中每个元素都有特定的类型。
let info:[string,number,boolean]=['字符串',1,true]


//类型别名
type a=number
type mytype=number|string|boolean
type arrType = (string | number)[]
type arrsType=(number|string)[]
type objType={
  name:string
  age:number
  sex:boolean
}
let obj :objType={
  name:'高位',
  age:18,
  sex:true
}


// 函数类型
//语法：(形参：类型，形参：类型。。。)=>返回值
function getSum(num1: number, num2: number): number{
    return num1 + num2
}
//表达式方式给函数指定参数和返回值类型
const add: (num1: number, num2: number) => number = (num1, num2) => {
	return num1 + num2
}
getSum(2,3)
//void 无返回值
function fn():void{
  console.log('hello')
}

//参数后面加？表示为可选参数
function fn2(a: number, b?: string){
      console.log(a, b)
  }
  fn2(10)
  fn2(10, 'hello')


  //对象类型
  let person: { name: string; age: number; sayHi(): void } = {
    name: 'jack',
    age: 19,
    sayHi() {}
  }



  // 接口
  // 注意点：在定义接口类型的时候，接口里面的属性可以不加逗号和分号，即使添加也不会影响结果和报错
interface Person{
  name:string
  age:number
  say():void
}

let person1:Person={
  name:'张三',
  age:18,
  say(){
    console.log('hello');
  }
}
// 接口和类型别名的对比

// 相同点：都可以给对象指定类型。

// 不同点：

// - 接口，只能为对象指定类型。
// - 类型别名，不仅可以为对象指定类型，实际上可以为任意类型指定别名。



// 接口继承
interface Person1{
  a:number
  b:string
}

interface Person2 extends Person1{
  c:boolean
}

let person2:Person2={
  a:2,
  b:'字符串',
  c:true
}


//类型推论
// 在 TS 中，某些没有明确指出类型的地方，TS 的类型推论机制会帮助提供类型。
let num3=20
// num3='d'报错

//类型断言
const link = document.querySelector('.link') //Element|null

// a.href会报错

const link1 = document.querySelector('.link') as HTMLAnchorElement
link1.href=''
// 注意点：通过console.dir()方法区查看标记的详细的类型
// console.dir(a1)


//字面量类型
const name1='张三'
// name1='李四'无法修改const定义常量

type Direction='上'|'左'|'下'|'右'

function fn1(option:Direction){
  console.log(option);
}

// fn1('')//仅能在Direction中选择